#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/2/1
# @Author: Sunny
# ========================

"""
python中的魔术方法：__开头 __结尾的方法统统都叫魔术方法

魔术方法：不需要手动去调用，都是在特定的情况下自动执行的

__init__:初始化，类创建对象时会自动调用，对创建的对象进行初始化设置

__call__:可以让类像函数一样去调用,实例对象加()去调用的时候会触发
"""

class MyClass:

    def __init__(self):
        print('这个是init方法')

    def __call__(self, *args, **kwargs):
        print('这是个__call__方法')



m = MyClass()

#实例对象加()调用的时候会触发__call__，执行__call__里面的代码
# 如果类里面没有__call__，实例对象是不可以后面直接加()使用的
m()


#------------------------通过类来实现装饰器--------------------------------------------------
"""
通过类的方式来实现装饰器
原理：
1.@Decorate  #func=Decorate(f)  这个过程其实就是一个实例化对象，func是Decorate(f)的实例化对象
2.Decorate(f)传的f,语法上看就是传的类的实例属性,所以Decorate类必须要写__init__来定义或者说接收f
3.外部func是一个对象，对象要调用类里面的属性，需要添加__call__方法，所以一般需要添加的功能，写在__call__里面
"""
class Decorate:
    def __init__(self,f):
        print('传进来的函数',f)
        self.f = f

    def __call__(self, *args, **kwargs):
        print('装饰器添加的功能代码-')
        self.f()
        print('装饰器添加的功能代码二')

@Decorate  #func=Decorate(f)  这个过程其实也是实例化对象
def func():
    print('原功能函数')

print(func) #func是Decorate装饰过的一个对象
func()

